package com.softme.trade.services;

import java.util.List;

import javax.faces.context.FacesContext;

import org.hibernate.SessionFactory;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

import com.softme.trade.i18n.I18nUtils;
import com.softme.trade.model.User;
import com.softme.trade.view.util.FacesUtil;

@Service("hibernateUserDetailsService")
public class HibernateUserDetailsService extends HibernateDaoSupport implements UserDetailsService
{

	@Autowired
	public HibernateUserDetailsService(SessionFactory sessionFactory)
	{
		setSessionFactory(sessionFactory);
	}

	@SuppressWarnings("unchecked")
	@Override
	public UserDetails loadUserByUsername(String login)
	{
		//FIXME - Caso a Classe que contém o login e senha de acesso ao sistema não for usuário
		//é necessário alterar
		DetachedCriteria criteria = DetachedCriteria.forClass(User.class, "usuario");
		criteria.add(Restrictions.eq("usuario.login", login));
		List resultado = getHibernateTemplate().findByCriteria(criteria);

		if (resultado != null && resultado.size() == 0)
		{
			//FIXME - Necessário colocar i18n
			throw new UsernameNotFoundException(I18nUtils.getString("userNotFound"));
		}

		User currentUser = (User) resultado.get(0);
		
		//coloca o usuário na sessão
		FacesUtil.setCurrentUser(currentUser);
		
		//exibi uma mensagem de boas vindas para o usuário administrador
		FacesUtil.showSucessMessage(I18nUtils.getMessage("welcome", currentUser.getName()));
		
		return currentUser;
	}

}
